在機器視覺中,一項基本需求是将不同的圖像色彩分量分離。 例如,这可以是將 RGB 分離为其分量,也可以是將 HSL 或 XYZ 等進行分離。 以下展示了一些色彩分離的範例。 所有範例均使用 RGB 面陣相機作為輸入。 当然,这些範例同樣适用于线阵相機。 此外,通常需要先进行 Bayer De-Mosaicing 或色彩空間轉換,且可以輕松将其添加到範例中。
这些範例假设主機 PC 上的後處理需要进行色彩分離。 因此,这些範例专注于色彩分離的 DMA 傳輸。 如果你需要在 FPGA 中对色彩分離的数据进行處理,这些範例也可以满足你的需求。
以下展示了多个範例。 所有範例的结果都是相同的。 然而,它们的實作方式完全不同,且各有优缺点。 你需要選擇最符合你需求的範例。 下表列出了所有範例及其部分 Property。
| 範例名稱 | 延遲 | DRAM | Block RAM 数量 | DMA Output |
|---|---|---|---|---|
| 三个 DMA | 無額外延遲 | 1 個 DRAM 緩衝區 | Low | 3 個 DMA。每個色彩分量一個。 |
| 具備 3 個緩衝區的循序 | 延遲已降至理論最小值。 | 3 個 DRAM 緩衝區 | Low | 1 個 DMA。循序色彩分量輸出。 |
| 具備 MultiROI Buffer 的循序 | 1 個影格延遲与頻寬限制。 | 1 個 DRAM 緩衝區 | 一般 | 1 個 DMA。循序色彩分量輸出。 |
| 具備预排序 MultiROI Buffer 的循序 | 1 個影格延遲 | 1 個 DRAM 緩衝區 | High | 1 個 DMA。循序色彩分量輸出。 |
| 具備先進緩衝區使用的循序 | 1 個影格延遲 | 1 個 DRAM 緩衝區 | Low | 1 個 DMA。循序色彩分量輸出。 |
表 20. 色彩分離範例概覽
上一表中显示的 Property 的完整說明以及不同方法的完整說明 将在后续章节中列出。
| 簡要說明 | |
|---|---|
|
檔案: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option1_ThreeDMA.va |
![]() |
|
Default Platform: mE5-MA-VCL |
|
|
短說明 RGB 色彩平面分離範例。 这些分量被分割到三個 DMA 輸出通道中。 |
|
这个範例非常简单。 輸入的 RGB 图像会被緩衝,随后色彩平面被分割到三个輸出連線中。 这三个連線使用三個 DmaToPC 運算子傳輸到 PC。 此方案的一个优点是具有极低的延遲。 图像不会被缓存在擷取卡中。 如果主機 PC 足够快,Operator ImageBuffer 将仅把图像延迟一条掃描線。 不会产生额外的延迟。 另一个优点是只需一个 DRAM 運算子。
A disadvantage of the implementation is that three DMA output operators are required. These operators consume many FPGA logic resources of the frame grabber. If you do not require such a minimized latency, you should consider one of the solution presented in the following chapters.
| 簡要說明 | |
|---|---|
|
檔案: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option2_ThreeBuffersOneDMA.va |
![]() |
|
Default Platform: mE5-MA-VCL |
|
|
短說明 RGB 色彩平面分離範例。 這些元件會被分割並緩衝至三個擷取卡緩衝區中。 之後,透過一個 DMA 通道依序輸出這些色彩平面。 |
|
在這個 RGB 色彩平面分離的解決方案中,色彩平面會透過 DMA 通道依序輸出。 這是透過將 RGB 輸入分割為其各個元件,並將色彩分別緩衝在三個 ImageBuffer 模組中來實現的。 使用 InsertImage 運算子,從 ImageBuffer 中依序讀取色彩平面。
在此範例中,務必在將資料寫入 ImageBuffer 之前增加 Parallelism。 否則,您會在 InsertImage 模組之後遇到瓶頸。
這種方法的優點在於您只需要一個 DMA 通道,從而減少所需的資源。 此外,延遲也達到循序輸出的理論最小值。 紅色色頻的 DMA 傳輸會立即開始而無延遲。 此解決方案的缺點是需要三個影格擷取卡 Memory 運算子。 由於它們受到限制,因此只有在不需要更多此類緩衝區時,此解決方案才有用。
| 簡要說明 | |
|---|---|
|
檔案: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option3_SequentialMultiROI.va |
![]() |
|
Default Platform: mE5-MA-VCL |
|
|
短說明 RGB 色彩平面分離範例。 執行三個 RGB 色彩平面的循序 DMA 輸出。 此序列由 ImageBufferMultiRoI 產生。 此解決方案並不理想,因為它會限制頻寬。 請參閱下一個範例以取得最佳化解決方案。 |
|
此解決方案是前一個範例與下一個範例之間的過渡步驟。 由於頻寬限制,不建議實作此解決方案。 不過,它以簡單的方式解釋瞭如何在只需要一個影格擷取卡 RAM 的情況下獲得與前一個範例相同的輸出。 為了將影像序列化,我們使用 ImageBufferMultiRoI 運算子。 在此運算子中,我們簡單地讀取相同的影像三次。 之後,我們為第一張影像選取紅色元件,為第二張影像選取綠色元件,並為第三張影像選取藍色元件。 這可以透過 ModuloCount 和 CASE 運算子輕鬆完成。 ModuloCount 的參數設定為對影格編號進行模 3 計數,即 {0, 1, 2, 0, 1, 2, ...}。
如前所述,此解決方案並非最佳方案,因為它會降低頻寬。 原因是因為我們讀取了相同的輸入影像三次,但只使用了三個元件中的一個。 因此在每個讀取週期中,我們會捨棄三分之二的資料。 下一個範例將展示一個克服此限制的類似解決方案。
| 簡要說明 | |
|---|---|
|
檔案: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option4_SequentialPreSortMultiROI.va |
![]() |
|
Default Platform: mE5-MA-VCL |
|
|
短說明 RGB 色彩平面分離範例。 執行三個 RGB 色彩平面的循序 DMA 輸出。 此序列由 ImageBufferMultiRoI 產生。 額外的預先排序最佳化了頻寬並解決了前一個範例中提出的問題。 |
|
此範例與前一個範例類似。 相比之下,在這種情況下我們沒有頻寬限制。 概念是相同的。 透過使用 ImageBufferMultiRoI 運算子,我們將三個色彩元件序列化。 與前一個範例不同的是,我們不在緩衝區之後分離色彩。 而是在將色彩寫入緩衝區之前先將其分離。 這是透過 PreSort HierarchicalBox 完成的,其內容如下圖所示。
此方法的概念是在將色彩元件寫入緩衝區之前先將其分離。 這適用於每個影像行。 因此,我們將色彩元件分割成三個連結。 這些產生的灰階連結現在包含輸入影像的影像行。 接下來,將這些行多工處理並附加。 其結果是我們在一個大型影像中有三個灰階影像。 紅色元件在左側,綠色在中間,藍色在右側。 請查看下圖中的模擬結果以了解實作方式。
在 ImageBufferMultiRoI 中,我們現在必須先讀取左側部分。 之後是中間部分,最後是右側部分。 因此,我們需要為每個 ROI 設定不同的 XOffset,如下所示。
在使用時,別忘了在分離元件之前增加 Parallelism,如範例所示。 這是避免在 InsertLine 模組之後產生瓶頸所必需的。 我們需要的 Parallelism 至少要比輸入高三倍,因為我們傳輸的是灰階 8 位元影像,而不再是 24 位元 RGB 影像。
此解決方案確實只需要一個 DRAM 運算子且不會限制頻寬。 這是一個最佳化的解決方案。 不過,需要一些塊 RAM 來緩衝 FIFO 中的分離元件行。 對於小型影像來說,這應該不會造成問題。 但是,如果您有大的影像寬度(例如每行 16384 個像素),則需要許多塊 RAM。 最後這個缺點透過下一個範例得到了解決。
| 簡要說明 | |
|---|---|
|
檔案: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option5_SequentialAdvanced.va |
![]() |
|
Default Platform: mE5-MA-VCL |
|
|
短說明 色彩平面分離範例。 RGB 輸入被分割為其元件,並透過一個 DMA 通道依序輸出。 分割是透過並行字元中收集相同的元件並使用 FrameBufferRandomRead 讀取來執行的。 |
|
這是 VisualApplets 中色彩平面分離最高階的範例。 它的重點在於將資源使用降到最低並將頻寬發揮到極致。 前一個範例使用預先排序來分離色彩元件,以便我們可以從緩衝區中個別讀取它們。 不過,預先排序中的 FIFO 需要一些塊 RAM。 在這種方法中,我們也使用預先排序。 相對地,我們只收集每個色彩元件的 8 個連續像素,然後再切換到下一個元件。 在前一個範例中,我們在切換到下一行之前收集了一個元件的完整行。 這項修改導致我們不再需要 FIFO。 不過,在這種情況下無法使用 ImageBufferMultiRoI。 取而代之的是,我們必須使用 FrameBufferRandomRead。
預先排序非常簡單。 首先,我們將 Parallelism 提高到八。 接下來,分割元件。 這會產生三個鏈結,每個鏈結具有 8 的 Parallelism。 現在,MergeParallel 會將元件的第八個像素排成序列。 因此,我們將得到以下序列:R0 到 R7、G0 到 G7、B0 到 B7、R8 到 R15、G8 到 G15、B8 到 B15、...
輸入端的 FIFO 是必要的,因為 PARALLELdn 從 16 變為 8。 此 FIFO 僅用於避免 DRC 等級 2 錯誤。 實際上,它不需要緩衝資料,因此我們將其大小設定為僅 2 個像素的非常小尺寸。
在我们預先排序像素之後,它們會被緩衝在 FrameBufferRandomRead 運算子中。 此運算子具有讀取列和行位址輸入,並允許隨機讀取資料。
此運算子只能配合 1 的 Parallelism 使用。 因此,我們使用 CastParallel 將 8 位元/像素、Parallelism 為 8 的資料轉換為 64 位元/像素、Parallelism 為 1 的資料。 這就是為什麼我们在上一個步驟中收集了八個連續像素。
為了分離色彩元件,我們必須將位址增加二以跳過不需要的顏色。 因此,對於紅色元件,讀取位址將會是:RColA(0) = 0, RColA(1) = 2, RColA(2) = 5, ... 對於綠色元件,讀取位址將會是:RColA(0) = 1, RColA(1) = 3, RColA(2) = 6, ... 階層式方塊 AdressGenerator 會產生這些讀取位址。 CreateBlankImage 運算子定義了所需的影像尺寸。 由於我們先前使用了從 8 到 1 的 CastParallel,我們必須使用除以 8 的影像寬度。
行位址只需透過將 Coordinate_X 輸出的 Scaling 乘以 3 來產生。 根據目前的元件,我們將 0、1 或 2 作為偏移量加到數值中。
透過使用 AppendImage,三個位址影像被合併為一個更大的影像。 列位址只需透過 0 與影像高度之間的 Counter 來產生。 在這種情況下,我們為此任務使用 ModuloCount 運算子。 現在可以將位址饋送到 FrameBufferRandomRead 運算子中。 切記在 CreatBlankImage 輸出端使用 2 的 Parallelism,以將 FrameBufferRandomRead 的效能發揮到極致。
在緩衝區之後,我們會得到一個大影像,其中前幾行包含紅色影像,接著是綠色影像,最後是藍色影像。 為了將這個大影像分割為三個獨立的 DMA 輸出,我們使用 SplitImage 並設定影像高度。
理解其實作最簡單的方法是逐步檢視中間結果。 請注意,您需要為一個結果影像模擬三個步驟。 這是因為必須由 CreateBlankImage 運算子產生 3 個影像。
此解決方案經過資源最佳化,因為只需要少量的區塊 RAM 資源。 此外,FPGA 邏輯資源也得到了有效利用。 位址產生只需少量的資源。












上一頁

